#include<bits/stdc++.h>
using namespace std;
struct T{
    double st;
    double ed;
}b[100010];
int n,m,sum;
bool is[100010];
double V,l;
int c;
vector< vector<int> > rela;
int dfs(int np,int d,string s){
    // cout<<s<<endl;
    int res=10000010;
    int cc=0;
    for(int i=0;i<rela[np].size();i++){
        for(int j=0;j<s.size();j++){
            if(rela[np][i]>s[j]-'0'&&rela[np][i]<s[j+1]-'0'){
                // cout<<"shwuqfd";
                s=s.substr(0,j+1)+char(rela[np][i]+'0')+s.substr(j+1,s.size()-j-1);
                break;
            }
        }
    }
    
    if(s.size()-2==sum) res=d;
    else{
        for(int i=np+1;i<rela.size();i++){
            res=min(dfs(i,d+1,s),res);
        }
    }
    return res;
}
void doit(){
    c=0;
    for(int i=0;i<rela.size();){
        rela.pop_back();
    }
    memset(is,0,sizeof(is));
    cin>>n>>m>>l>>V;
    for(int i=1;i<=n;i++){
        double d,v,a;
        cin>>d>>v>>a;
        if(a==0){
            if(v>V){
                b[c].st=d;
                b[c].ed=l;
                c++;
            }
        }else{
            if(a>0){
                if(v>V){
                    b[c].st=d;
                    b[c].ed=l;
                    c++;
                }else if(v==V){
                    b[c].st=d+0.5;
                    b[c].ed=l;
                    c++;
                }else if(v<V){
                    double s=(V*V-v*v)/(2*a);
                    b[c].st=s+d;
                    if(s==double(int(s))){
                       b[c].st+=0.5;
                    } 
                    b[c].ed=l;
                    if(b[c].st<l) c++;
                }
            }else if(a<0){
                if(v>V){
                    double s=(V*V-v*v)/(2*a);
                    b[c].st=d;
                    b[c].ed=d+s;
                    if(s==double(int(s))){
                       b[c].ed-=0.5;
                    } 
                    c++;
                    // if(d+s<l) c++;
                }
            }
        }
    }
    sum=0;
    // cc=0;
    for(int i=0;i<m;i++){
        int pl;
        cin>>pl;
        vector<int>tt;
        for(int j=0;j<c;j++){
            if(b[j].st<=pl&&pl<=b[j].ed){
                
                tt.push_back(j);
                if(is[j]==0){
                    is[j]=1;
                    sum++;
                }
            } 
        }
        rela.push_back(tt);
    }
    
    
    int minn=INT_MAX;
    for(int i=0;i<rela.size();i++){
        minn=min(minn,dfs(i,1,"/a"));
    }
   
    cout<<sum<<' '<<m-minn<<endl;
}
int t;
int main(){
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    cin>>t;
    for(int i=0;i<t;i++){
        doit();
    }
}